package CollectionTest;

import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;

/*
迭代器对象，用于集合遍历
    关于迭代器
        迭代器是一个java对象，Iterator，可以通过集合中的iterator()方法来获取这个对象
        一定要注意:集合结构只要发生改变，迭代器必须重新获取
        如果集合结构发生了改变，迭代器没有重新获取时，调用next()方法时，会发生java.util.ConcurrentModificationException
        遍历删除需要通过迭代器中的remove()方法
        原理:获取迭代器实际上是将集合拍了一个快照，如果调用集合中的remove()遍历删除元素，快照与集合没有一致，遍历时将会发生异常
            如果调用迭代器的remove()遍历删除元素，快照的集合元素会一起被删除，同时集合中的元素也会被删除,快照与集合结构一致，不会发生异常
 */
public class IteratorTest1 {
    public static void main(String[] args){
        //HashSet集合是无序的且不重复的
        Collection hashSet = new HashSet();
        hashSet.add(123);
        hashSet.add("你好");
        hashSet.add("java");
        hashSet.add("C语言");
        boolean b = hashSet.add("C语言");
        System.out.println(b); //false HashSet集合中已有“C语言”这个元素所有添加失败
        //调用iterator(),获取迭代器对象
        Iterator i  = hashSet.iterator();

        //遍历集合，输出的元素是并不是按添加顺序的，而是随机无序的
        while(i.hasNext()){
            Object o = i.next();
            System.out.println(o);
            //hashSet.remove(o); //集合结构发生变化，发生java.util.ConcurrentModificationException
            i.remove(); //使用迭代器中remove删除，迭代器保存的快照和集合结构一致，不会发生异常
        }
        System.out.println(hashSet.size()); //0
    }
}
